package util;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.UUID;

public class UploadHelper {
    public static List<FileItem> getFileList(HttpServletRequest request, Integer singleSize,
                                             Integer totalSize, Integer bufferSize) throws FileUploadException {
        //创建一个DiskFileItemFactory工厂
        DiskFileItemFactory factory=new DiskFileItemFactory();
        //设置缓冲区的大小为100KB，如果不指定，
        // 那么缓冲区的大小默认是10KB
        factory.setSizeThreshold(bufferSize);
        //创建一个文件上传解析器
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setFileSizeMax(singleSize);
        //设置上传文件总量的最大值，
        // 最大值=同时上传的多个文件的大小的最大值的和，
        // 目前设置为10MB
        upload.setSizeMax(totalSize);
        //4、使用ServletFileUpload解析器解析上传数据，
        // 解析结果返回的是一个List<FileItem>集合，
        // 每一个FileItem对应一个Form表单的输入项
        List<FileItem> list = upload.parseRequest(request);
        return list;
    }
    public static void localUpload(List<FileItem> list, String filename, String path) throws IOException {
        InputStream in = null;
        FileOutputStream out = null;
        for(FileItem item : list) {
            //获取item中的上传文件的输入流
            in = item.getInputStream();
            //得到文件保存的名称
            String saveFilename = makeFileName(filename);
            //得到文件的保存目录
            String realSavePath = makePath(path);
            //创建一个文件输出流
            out = new FileOutputStream(realSavePath + "\\" + saveFilename);
            //创建一个缓冲区
            byte[] buffer = new byte[1024];
            //判断输入流中的数据是否已经读完的标识
            int len;
            //循环将输入流读入到缓冲区当中，
            // (len=in.read(buffer))>0就表示in里面还有数据
            while ((len = in.read(buffer)) > 0) {
                //使用FileOutputStream输出流
                // 将缓冲区的数据写入到指定的目录
                // (savePath + "\\" + filename)当中
                out.write(buffer, 0, len);
            }
        }
        if(in!=null){
            //关闭输入流
            in.close();
        }
        if(out!=null){
            //关闭输出流
            out.close();
        }
    }
    private static String makeFileName(String filename){
        //为防止文件覆盖的现象发生，要为上传文件产生一个唯一的文件名
        return UUID.randomUUID().toString() + "_" + filename;
    }
    private static String makePath(String s){
        //用日期得到文件名的
        Calendar date= Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd");
        String name= format.format(date.getTime());
        String dir = s + "\\" + name;
        java.io.File file=new java.io.File(dir);
        //如果目录不存在
        if(!file.exists()){
            //创建目录
            boolean mkdirs = file.mkdirs();
        }
        return dir;
    }
}
